﻿using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Net.Mime;
using System.Runtime.InteropServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace RemotingSocket
{
    public delegate void SendMessageEventHandler(string msg);

    public interface ISendMessageBusiness
    {
        void SendMessage(string msg);
    }


    public class NetFileTransfer : MarshalByRefObject,ISendMessageBusiness
    {
        public static event SendMessageEventHandler SendMessageEvent;

        public  void SendMessage(string msg)
        {
            SendMessageEventHandler handler = SendMessageEvent;
            if (handler != null)
            {
                handler(msg);
            }
        }

        /// <summary>
        /// 获取文件数组
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public byte[] GetFileBytes(string filePath)
        {
            if (File.Exists(filePath))
            {
                try
                {
                    using (FileStream fs = new FileStream(
                        filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        fs.Close();
                        return buffer;
                    }
                }
                catch
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 发送数据 
        /// </summary>
        /// <param name="savePath"></param>
        /// <param name="fileBytes"></param>
        /// <returns></returns>
        public bool SendFileBytes(string savePath, byte[] fileBytes)
        {
            if (fileBytes == null) return false;
            
            try
            {
                using (FileStream fs = new FileStream(
                    savePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
                {
                    fs.Write(fileBytes, 0, fileBytes.Length);
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }


        }         
    }

    //public class NetFileTransferServer : Component
    //{
    //    public string msg;
    //    private TcpChannel _channel = null;

    //    private int _port = 8050;

    //    private string _registermethod = "FileService";

    //    private bool _active = false;

    //    public int Port
    //    {
    //        get { return this._port; }
    //        set { this._port = value; }
    //    }

    //    public string Registermethod
    //    {
    //        get { return this._registermethod; }
    //        set { this._registermethod = value; }
    //    }

    //    public bool Active
    //    {
    //        get { return this._active; }
    //    }

    //    public void Start()
    //    {
    //        try
    //        {
    //            _channel = new TcpChannel(this._port);
    //            ChannelServices.RegisterChannel(_channel);
    //            RemotingConfiguration.RegisterWellKnownServiceType(typeof(NetFileTransfer), this._registermethod, WellKnownObjectMode.SingleCall);
    //            NetFileTransfer.SendMessageEvent += new SendMessageEventHandler(NetFileTransfer_SendMessageEvent);
    //            this._active = true;
    //        }
    //        catch (Exception e)
    //        {
    //            Console.WriteLine(e.Message);
    //            this._active = false;
    //        }
    //    }

    //    public void NetFileTransfer_SendMessageEvent(string msg)
    //    {
    //        LoginSuccessStu stu = new LoginSuccessStu {StuNumber = msg};
    //       // xmlHelp.XmlHelper.XmlSerializeToFile(stu,Application);
    //    }

    //    public void Stop()
    //    {
    //        this._active = false;
    //        if (_channel != null)
    //        {
    //            ChannelServices.UnregisterChannel(_channel);
    //        }
    //    }

    //    public string NoticeRegisterMethodName(int ipAddressIndex)
    //    {
    //        //tcp://localhost:8085/FileService
    //        try
    //        {
    //            IPHostEntry heserver = Dns.Resolve("localhost");
    //            IPAddress currAddr = heserver.AddressList[ipAddressIndex];
    //            return String.Format("tcp://{0}:{1}/{2}", currAddr.ToString(), this._port.ToString(), this._registermethod);
    //        }
    //        catch (Exception e)
    //        {
    //            return e.Message;
    //        }
    //    }       
    //}

    //public class NetFileTransferClient : Component
    //{
    //    private NetFileTransfer _netFileTransfer = null;
    //    private bool _active = false;
    //    private string _noticeRegisterMethodName = "tcp://192.168.1.205:8085/FileService";
    //    private int _port = 8085;

       
    //    public int Port
    //    {
    //        get { return this._port; }
    //        set { this._port = value; }
    //    }

    //    public string NoticeRegisterMethodName
    //    {
    //        get { return this._noticeRegisterMethodName; }
    //        set { this._noticeRegisterMethodName = value; }
    //    }

    //    public bool Active
    //    {
    //        get { return this._active; }
    //    }

    //    public NetFileTransfer NetFileTransferObject
    //    {
    //        get
    //        {
    //            return this._netFileTransfer;
    //        }
    //    }

    //    public bool Connect()
    //    {
    //        try
    //        {
    //            _netFileTransfer = (NetFileTransfer)Activator.GetObject(typeof(RemotingSocket.NetFileTransfer), _noticeRegisterMethodName);
    //            if (_netFileTransfer != null && _netFileTransfer.ToString().Length > 1)
    //            {
    //                this._active = true;
    //                return true;
    //            }
    //            else
    //            {
    //                this._active = false;
    //                return false;
    //            }
    //        }
    //        catch
    //        {
    //            this._active = false;
    //            return false;
    //        }
    //    }

    //    public void Disconnection()
    //    {
    //        _netFileTransfer = null;
    //        _active = false;
    //    }

    //    public byte[] GetFileBytes(string remoteFilePath)
    //    {
    //        if (!_active) return null;
    //        try
    //        {
    //            return _netFileTransfer.GetFileBytes(remoteFilePath);
    //        }
    //        catch
    //        {
    //            return null;
    //        }
    //    }

    //    public bool GetFile(string remoteFilePath, string localSavePath)
    //    {
    //        if (!_active) return true;
    //        try
    //        {
    //            byte[] filebytes = _netFileTransfer.GetFileBytes(remoteFilePath);
    //            if (filebytes != null)
    //            {
    //                using (FileStream fs = new FileStream(localSavePath, FileMode.CreateNew, FileAccess.Write,
    //                                                FileShare.ReadWrite))
    //                {
    //                    fs.Write(filebytes, 0, filebytes.Length);
    //                    fs.Close();
    //                    return true;
    //                }
    //            }
    //            else
    //            {
    //                return false;
    //            }
    //        }
    //        catch
    //        {
    //            return false;
    //        }
    //    }

    //    public bool SendFileBytes(byte[] fileBytes, string remoteSavePath)
    //    {
    //        if (!_active) return false;
    //        try
    //        {
    //            return _netFileTransfer.SendFileBytes(remoteSavePath, fileBytes);
    //        }
    //        catch
    //        {
    //            return false;
    //        }
    //    }

    //    public bool SendFile(string localFilePath, string remoteSavePath)
    //    {
    //        if (!_active) return false;
    //        try
    //        {
    //            if (!File.Exists(localFilePath)) return false;

    //            using (FileStream fs = new FileStream(localFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    //            {

    //                byte[] buffer = new byte[fs.Length];
    //                fs.Read(buffer, 0, buffer.Length);
    //                fs.Close();

    //                return _netFileTransfer.SendFileBytes(remoteSavePath, buffer);
    //            }

    //        }
    //        catch
    //        {
    //            return false;
    //        }
    //    }

    //    public void SendMessage(string msg)
    //    {
    //       _netFileTransfer.SendMessage(msg); 
    //    }
    //}
}